import Vue from 'vue'
import Router from 'vue-router'
// import { actionTrack } from '@/assets/js/utils'
import { Dialog, Toast } from 'vant'
import { get } from '@/assets/service/http'
Vue.use(Router)

/**
 * meta中特殊参数说明
 * @param unAuthorization // 不用走网页授权获取openid
 * @param setMenuAndShareInPage // 在路由对应的页面中，设置微信工具菜单的显隐和分享
 * @param showAllMenu // 展示所有微信工具菜单
 * @param showMenuList // 需要展示的微信工具菜单
 * @param forbitShare // 禁止分享
 * @param shareInfo // 分享的配置信息 title、desc、link、imgUrl
 * @param originType // 来源类型 mp代表微信公众号；cp代表企业号
 */
const route = new Router({
  mode: 'history',
  base: `${process.env.VUE_APP_BASE_URL}${process.env.VUE_APP_VERSION}/`,
  routes: [
    {
      path: '/'
    },
    // 微学院文章详情页面
    {
      path: '/detail/:articleId',
      name: 'detail',
      component: () => import('@/views/detail'),
      meta: {
        originType: 'mp',
        setMenuAndShareInPage: true
      }
    },
    // 微信素材-多图文
    {
      path: '/materialGroup/:newsId',
      name: 'materialGroup',
      component: () => import('@/views/material/group'),
      meta: {
        originType: 'mp',
        setMenuAndShareInPage: true
      }
    },
    // 微信素材-单图文
    {
      path: '/materialDetail/:newsId',
      name: 'materialDetail',
      component: () => import('@/views/material/detail'),
      meta: {
        originType: 'mp',
        setMenuAndShareInPage: true
      }
    },
    // 企微素材-多图文
    {
      path: '/materialCpGroup/:newsId',
      name: 'materialCpGroup',
      component: () => import('@/views/materialCp/group'),
      meta: {
        originType: 'cp',
        setMenuAndShareInPage: true
      }
    },
    // 企微素材-单图文
    {
      path: '/materialCpDetail/:mediaId',
      name: 'materialCpDetail',
      component: () => import('@/views/materialCp/detail'),
      meta: {
        originType: 'cp',
        setMenuAndShareInPage: true
      }
    },
    {
      path: '*',
      name: 'notFound',
      component: () => import('@/views/not_found')
    }
  ]
})

// 使用初始链接上的sessionId，获取appid等其他全局参数
let getAppid = (to) => {
  return new Promise((resolve, reject) => {
    // 如果是本地开发环境，模拟获取到openid
    if (process.env.NODE_ENV === 'development') {
      sessionStorage.setItem('openid', 'oJeZPv8lcfJHkt6SCz27A36OaFfI') // ZMH 悦米技术服务
    }
    /**
     * 【注】此处若要通过sessionId获取其他全局参数(如 siteId)，需要通过添加改参数的判断
     */
    if (sessionStorage.getItem('appid')) {
      resolve('获取公众号appid成功')
    } else {
      // 通过项目Id，获取对应的appid
      if (to.query && to.query.sessionId) {
        sessionStorage.setItem('sessionId', to.query.sessionId)
        let url = `/session`
        let param = {
          psid: to.query.sessionId
        }
        get(url, param).then(res => {
          if (res.code === 200 && res.data) {
            sessionStorage.setItem('appid', res.data.wxAppid)
            resolve('获取公众号appid成功')
          } else {
            reject(new Error('获取公众号appid失败'))
          }
        })
      } else {
        reject(new Error('获取公众号appid失败'))
      }
    }
  })
}

// 使用初始链接上的sessionId，获取agentId等其他全局参数
let getAgentId = (to) => {
  return new Promise((resolve, reject) => {
    // 如果是本地开发环境，模拟获取到openid
    if (process.env.NODE_ENV === 'development') {
      sessionStorage.setItem('isRedirect', true)
      // sessionStorage.setItem('corpId', 'wwb61d1788cf650922') // 阿星集团
      // sessionStorage.setItem('agentId', '1000013') // 阿星集团-测试应用
      sessionStorage.setItem('userId', 'zhuminhong') // 阿星集团-朱敏宏
      // sessionStorage.setItem('userId', 'will') // 阿星集团-will
    }
    /**
     * 【注】此处若要通过sessionId获取其他全局参数(如 siteId)，需要通过添加改参数的判断
     */
    if (sessionStorage.getItem('agentId')) {
      resolve('获取agentId成功')
    } else {
      // 通过项目Id，获取对应的appid
      if (to.query && to.query.sessionId) {
        sessionStorage.setItem('sessionId', to.query.sessionId)
        let url = `/session`
        let param = {
          psid: to.query.sessionId
        }
        get(url, param).then(res => {
          if (res.code === 200 && res.data && res.data.agentId) {
            sessionStorage.setItem('agentId', res.data.agentId)
            sessionStorage.setItem('corpId', res.data.corpId)
            resolve('获取agentId成功')
          } else {
            reject(new Error('获取agentId失败'))
          }
        })
      } else {
        reject(new Error('获取agentId失败'))
      }
    }
  })
}

// 获取当前路径上的openid 和 isRedrect
let checkRouteQuery = (to) => {
  if (to.query && to.query.redirect) {
    sessionStorage.setItem('isRedirect', to.query.redirect)
  }
  if (to.query && to.query.userId) {
    sessionStorage.setItem('userId', to.query.userId)
  }
  if (to.query && to.query.openid) {
    sessionStorage.setItem('openid', to.query.openid)
    // 去除地址栏上的敏感参数
    let link = location.href.replace(/&?(openid|appid|ssid|redirect)=[^&]+/g, '')
    sessionStorage.setItem('reloaded', true)
    location.replace(link)
  }
}

// 获取全局参数————公众号信息
let getWechatMpInfo = () => {
  return new Promise((resolve, reject) => {
    let vue = new Vue()
    let url = `${vue.SERVICE_PORTAL}/${sessionStorage.getItem('appid')}`
    let param = {}
    get(url, param).then(res => {
      if (res.code === 200) {
        if (res.data) {
          localStorage.setItem('wechatInfo', JSON.stringify(res.data))
        } else {
          localStorage.setItem('wechatInfo', JSON.stringify({}))
        }
        resolve('获取公众号信息成功')
      } else {
        reject(new Error('获取公众号信息失败'))
      }
    })
  })
}

// 获取全局参数————粉丝信息
let getFansInfo = () => {
  return new Promise((resolve, reject) => {
    // 如果没有拿到openid, 不调用粉丝接口
    if (!sessionStorage.getItem('openid')) {
      localStorage.setItem('isSubscribe', 0)
      localStorage.setItem('fansAvatar', '')
      localStorage.setItem('fansNickName', '')
      localStorage.setItem('userName', '')
      localStorage.setItem('userType', -1)
      localStorage.setItem('userId', '')
      return resolve('获取粉丝信息成功')
    }
    let vue = new Vue()
    let url = `${vue.SERVICE_PORTAL}/${sessionStorage.getItem('appid')}/fans/${sessionStorage.getItem('openid')}`
    let param = {}
    get(url, param).then(rsp => {
      if (rsp.code === 200) {
        if (rsp.data) {
          let baseInfo = rsp.data.baseInfo
          let userInfo = rsp.data.userInfo
          localStorage.setItem('isSubscribe', baseInfo && baseInfo.isSubscribe ? baseInfo.isSubscribe : 0)
          localStorage.setItem('fansAvatar', userInfo && userInfo.avatar ? userInfo.avatar : '')
          localStorage.setItem('fansNickName', userInfo && userInfo.nickName ? userInfo.nickName : '')
          localStorage.setItem('userName', userInfo && userInfo.realName ? userInfo.realName : '')
          localStorage.setItem('userType', userInfo && userInfo.userType ? userInfo.userType : -1)
          localStorage.setItem('userId', userInfo && userInfo.userId ? userInfo.userId : '')
        } else {
          localStorage.setItem('isSubscribe', 0)
          localStorage.setItem('fansAvatar', '')
          localStorage.setItem('fansNickName', '')
          localStorage.setItem('userName', '')
          localStorage.setItem('userType', -1)
          localStorage.setItem('userId', '')
        }
        resolve('获取粉丝信息成功')
      } else {
        reject(new Error('获取粉丝信息失败'))
      }
    })
  })
}

// 获取全局参数————企业用户信息
let getUserInfo = () => {
  return new Promise((resolve, reject) => {
    // 如果没有拿到 userId
    if (!sessionStorage.getItem('userId')) {
      sessionStorage.setItem('cpUserName', '')
      sessionStorage.setItem('cpUserMobile', '')
      return resolve('获取企微用户信息成功')
    }
    let url = `/portal/cp/${sessionStorage.getItem('corpId')}/${sessionStorage.getItem('userId')}`
    get(url).then(res => {
      if (res.code === 200) {
        if (res.data) {
          sessionStorage.setItem('cpUserName', res.data.name)
          sessionStorage.setItem('cpUserMobile', res.data.mobile)
        } else {
          sessionStorage.setItem('cpUserName', '')
          sessionStorage.setItem('cpUserMobile', '')
        }
        resolve('获取企微用户信息成功')
      } else {
        reject(new Error('获取企微用户信息失败'))
      }
    })
    // // 模拟获取到信息
    // sessionStorage.setItem('cpUserName', '朱敏宏')
    // sessionStorage.setItem('cpUserMobile', '13917332788')
    // return resolve('获取企微用户信息成功')
  })
}

// 通过授权, 获取openid
let checkOpenid = () => {
  return new Promise((resolve, reject) => {
    // 如果已经有openid，直接进行后续操作
    if (sessionStorage.getItem('openid')) {
      resolve()
    // 如果没有openid
    } else {
      // 如果没有openid, 但已经进行过网页授权，则弹出提示
      if (sessionStorage.getItem('isRedirect')) {
        Toast({
          message: '网页授权失败，无法获取openid'
        })
      // 否则进行网页授权
      } else {
        // 通过当前页面url获取重定向地址
        let pagePath = encodeURIComponent(`${location.href}`) // 重定向路由的参数，需要加在 targetUrl中
        let targetUrl = ''
        targetUrl = `${location.origin}/roche2/api/wechat/server/response/redirect?target_redirect=${pagePath}`
        let realTargetUrl = encodeURIComponent(targetUrl).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28').replace(/\)/g, '%29').replace(/\*/g, '%2A').replace(/%20/g, '+')
        // let url = '/wechat/server/response/v3/get_oauth2_url'
        let url = '/wechat/server/response/get_oauth2_url'
        let param = {
          targetUrl: realTargetUrl,
          // sessionId: sessionStorage.getItem('sessionId')
          appid: sessionStorage.getItem('appid')
        }
        get(url, param, {}).then(res => {
          if (res.code === 200) {
            let url = res.data.url
            location.href = url
            // vue.console('get_oauth2_url: ', url)
          }
        })
      }
    }
  })
}

// 通过授权, 获取userId/openid
let checkUserId = () => {
  return new Promise((resolve, reject) => {
    // 如果已经有userId，直接进行后续操作
    if (sessionStorage.getItem('userId')) {
      resolve()
    // 如果没有userId
    } else {
      // 如果没有userId, 但已经进行过网页授权，则弹出提示
      if (sessionStorage.getItem('isRedirect')) {
        // 如果是微信环境，显示企业号引导关注二维码
        // if (sessionStorage.getItem('userAgent') === 'wechat') {
        //   window.eventBus.$emit('showCorpQr')
        // } else {
        //   // 如果没有userId, 但已经进行过网页授权，则表示非企业微信环境或非企业用户
        //   Toast({
        //     message: '非企业成员无法访问',
        //     duration: 0
        //   })
        // }
        resolve()
      // 否则进行网页授权
      } else {
        // 企业号通过当前页面url获取重定向地址
        let pagePath = encodeURIComponent(`${location.href}`) // 重定向路由的参数，需要加在 targetUrl中
        // let url = `http://yuemia.isadream.cn/wechat/cp/portal/${sessionStorage.getItem('agentId')}/auth?redirectUrl=${pagePath}` // 本地
        let url = `${location.origin}/roche2/api/wechat/cp/portal/${sessionStorage.getItem('agentId')}/auth?redirectUrl=${pagePath}` // 线上
        location.href = url
        // // 公众号通过当前页面url获取重定向地址
        // let pagePath = encodeURIComponent(`${location.href}`) // 重定向路由的参数，需要加在 targetUrl中
        // let targetUrl = ''
        // targetUrl = `${location.origin}${process.env.VUE_APP_SERVICE_API}/wechat/server/response/redirect?target_redirect=${pagePath}`
        // let realTargetUrl = encodeURIComponent(targetUrl).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28').replace(/\)/g, '%29').replace(/\*/g, '%2A').replace(/%20/g, '+')
        // let url = '/wechat/server/response/get_oauth2_url'
        // let param = {
        //   targetUrl: realTargetUrl,
        //   appid: sessionStorage.getItem('appid')
        // }
        // get(url, param, {}).then(res => {
        //   if (res.code === 200) {
        //     let url = res.data.url
        //     location.href = url
        //   }
        // })
      }
    }
  })
}

// 获取公众号相关全局参数
let getMpGlobalData = (next) => {
  // 判断是否获取了全局参数, 直接进行后续操作
  if (sessionStorage.getItem('getMpGlobalData')) {
    next()
  // 如果没有, 则先获取全局参数
  } else {
    Promise.all([
      getWechatMpInfo(),
      getFansInfo()
    ]).then(res => {
      sessionStorage.setItem('getMpGlobalData', true)
      next()
    }).catch(e => {
      Toast({
        message: e.message || '获取全局参数失败'
      })
    })
  }
}

// 获取企业号相关全局参数
let getCpGlobalData = (next) => {
  // 判断是否获取了全局参数, 直接进行后续操作
  if (sessionStorage.getItem('getCpGlobalData')) {
    next()
  // 如果没有, 则先获取全局参数
  } else {
    Promise.all([
      getUserInfo()
    ]).then(res => {
      sessionStorage.setItem('getCpGlobalData', true)
      next()
    }).catch(e => {
      Toast({
        message: e.message || '获取全局参数失败'
      })
    })
  }
}

route.beforeEach((to, from, next) => {
  let vue = new Vue()
  // 判断当前应用的运行环境
  if (!sessionStorage.getItem('userAgent')) {
    vue.checkUserAgent()
  }
  // 如果进入的是企业号相关的页面, 走企业号授权流程
  if (to.meta && to.meta.originType === 'cp') {
    getAgentId(to).then(() => {
      document.title = ''
      // 当前路径上的openid 和 isRedrect
      checkRouteQuery(to)
      // 如果是非微信环境和企业微信环境， 直接获取全局参数并进入页面
      if (sessionStorage.getItem('userAgent') === 'normal') {
        getCpGlobalData(next)
      // 如果是微信环境，该页面设置了无需授权，直接获取全局参数并进入页面
      } else if (to.meta.unAuthorization) {
        getCpGlobalData(next)
      // 如果是微信环境，且页面需要授权
      } else {
        // 首先获取openid
        checkUserId().then(() => {
          // 获取全局参数并进入页面
          getCpGlobalData(next)
        })
      }
    }).catch(e => {
      Toast({
        message: e.message
      })
    })
  // 如果进入的公众号相关的页面，走公众号授权流程
  } else {
    // 首先通过页面链接上的sessionId，获取其对应的全局参数
    getAppid(to).then(() => {
      document.title = ''
      // 当前路径上的openid 和 isRedrect
      checkRouteQuery(to)
      // 如果是非微信环境， 直接获取全局参数并进入页面
      if (sessionStorage.getItem('userAgent') === 'normal') {
        getMpGlobalData(next)
      // 如果是微信环境，该页面设置了无需授权，直接获取全局参数并进入页面
      } else if (to.meta.unAuthorization) {
        getMpGlobalData(next)
      // 如果是微信环境，且页面需要授权
      } else {
        // 首先获取openid
        checkOpenid().then(() => {
          // 获取全局参数并进入页面
          getMpGlobalData(next)
        })
      }
    }).catch(e => {
      Toast({
        message: e.message
      })
    })
  }
})

route.afterEach((to, from) => {
  setTimeout(() => {
    let vue = new Vue()
    // 如果该页面不需要单独设置 微信工具菜单显隐 和 设置分享
    if (!to.meta.setMenuAndShareInPage) {
      let param = {}
      // 是否显示所有微信工具菜单
      if (to.meta.showAllMenu) {
        param.showAllMenu = to.meta.showAllMenu
      }
      // 显示微信工具菜单列表
      if (to.meta.showMenuList) {
        param.showMenuList = to.meta.showMenuList
      }
      // 是否禁止分享
      if (to.meta.forbitShare) {
        param.forbitShare = to.meta.forbitShare
      }
      // 分享配置参数
      if (to.meta.shareInfo) {
        param.shareInfo = to.meta.shareInfo
      }
      vue.setCropToolMenuAndShare(param)
    }
    // // 如果不是详请页面，则触发访问数据埋点
    // if (to.name !== 'articleDetail' &&
    //     to.name !== 'publicClassDetail' &&
    //     to.name !== 'liveDetail') {
    //   // 访问数据埋点
    //   setTimeout(() => {
    //     // 如果页面有pageId
    //     if ((to.query.pageId || to.params.pageId) && !to.meta.isTrack) {
    //       actionTrack({
    //         action: 0,
    //         mode: 'page',
    //         page: to.meta.title || '',
    //         pageId: to.query.pageId || to.params.pageId
    //       })
    //     }
    //   }, 700)
    // }
  }, 300)
  Toast.clear()
  Dialog.close()
})
export default route
